<?php
include_once BXD_INCLUDEPATH . 'components/Dialog.php';

/**
 * Description of DialogModal
 *
 * @author Damiano Ciarla
 */
class ModalDialog extends Dialog
{
	private $text		= null;		//--> Testo statico da stampare nella dialog
	private $url		= null;		//--> Url da caricare nella dialog
	private $showOption	= array();	//--> Array di valori per mostrare la dialog con metodi differenti

	const REFRESHDATA	= "RefreshData";
	
	const LABEL_REFRESHDATA = "Aggiorna";
	
	/**
	 * Inizializzazione dei parametri base utili alla creazione della Dialog
	 * 
	 * @param string $divName		Nome ID della Dialog
	 * @param int $width			Larghezza
	 * @param int $height			Altezza
	 * @param boolean $resizable	Indica la possibilita' che la dialog possa essere ridimensionata
	 */
	
    public function __construct($divName, $width = 400, $height = 400, $resizable = false)
	{
		parent::__construct($divName, $width, $height, $resizable);
	}

	/**
	 * Questa funzione setta una coppia di valori che sono rispettivamente la CLASSE e l'ATTRIBUTO 
	 * di un elemento nella pagina. Questi due valori serviranno a creare una o piu' funzioni di jQuery
	 * che permetteranno di poter aprire la finestra di dialogo e caricare al suo interno un contenuto 
	 * che puo' variare e secondo del valore contenuto nell'ATTRIBUTO. 
	 * 
	 * Ad esempio posso impostare che al click su ogni elemento con CLASSE css pari a 'button' carico
	 * nella dialog il percorso specificato nell'ATTRIBUTO 'title'.
	 * 
	 * 						!! UTILE NELLA COSTRUZIONE DI ACTION NELLE TABELLE !!
	 *
	 * @param string $className	Nome della classe su cui attivare l'opzione di ONCLICK
	 * @param string $tagName	Tag che contiene l'url da far caricare nella Dialog Box
	 */

	public function addShowOption($class, $tag)
	{
		$this->showOption[$class] = $tag;
	}

	/**
	 * Imposta il testo statico da visualizzare nella Dialog Box
	 *
	 * @param string $text Testo da visualizzare nella Dialog Box
	 */

	public function setStaticText($text)
	{
		$this->text = htmlentities($text, ENT_QUOTES, "UTF-8");
	}

	/**
	 * URL utilizzato nella chiamata AJAX che al termine della richiesta carica il risultato nella Dialog Box
	 *
	 * @param string $url Url usato per caricare dinamicamente il contenuto dell'URL nella Dialog Box
	 */

	public function setDinamicUrl($url)
	{
		$this->url = $url;
	}
	
	/*** -------------------- *** FUNZIONI PER LA STAMPA *** -------------------- ***/
	
	/**
	 * Stampa della 'DIALOG'
	 * 
	 * Viene creato tutto lo script per la stampa della 'DIALOG' in base alla configurazione esplicitata
	 * nei metodi precedenti.
	 */

	public function show()
	{
		//--> Controllo se ci sono le condizioni iniziali per poter creare la Dialog Box

		if(is_null($this->url) and is_null($this->text) and count($this->showOption) == 0)
		{
			echo	"<font color='red'><strong>" .
					TD_("COMPONENTE MODAL DIALOG:", "components") .
					"</strong> " .
					TD_("È obbligatorio specificare l'URL o un TESTO da far caricare nella Dialog Box", "components") .
					"</font>";
			
			$this->errorOccured = true;

			return;
		}

		//--> Controllo se e' stato impostato il buttonOpen. In caso positivo viene creato insieme allo script

		if(count($this->buttonOpen) > 0 && $this->buttonOpen['DATA']['AUTOSHOW'])
		{
			$this->showButtonOpen();
		}
		
		echo "<div id='" . $this->divName . "' title='" . $this->title . "'>";
		
		if(is_null($this->url)) echo "<p>" . $this->text . "</p>";
		
		echo "</div>";

		//--> Se non viene trovato nessun URL viene richiamato lo script di config nella classe 'padre' per la creazione della 'DIALOG' base
		
		if(is_null($this->url) and count($this->showOption) == 0)
			echo parent::autogenerateScriptConfig();
		else
			echo $this->autogenerateScriptConfig();
	}

	//--> Funzione per la stampa del PULSANTE usato esclusivamente per l'apertura della Dialog Box

	public function showButtonOpen()
	{
		if(!$this->errorOccured)
		{
			$this->createdButton = true;

			HtmlComponents::button(HtmlComponents::BUT_TYPE_BUTTON, $this->buttonOpen['DATA']['LABEL'], HtmlComponents::NEW_WIN, "buttuonOpen_" . $this->divName);

			if(!$this->createdButtonScript)
			{
				echo $this->autogenerateScriptButtonConfig();
			}
		}
	}
	
	/*** -------------------- *** METODI PER LA CREAZIONE DEGLI SCRIPT *** -------------------- ***/
	
	/**
	 * Funzione che genera automaticamente lo script per creare la Dialog Box
	 * prendendo i valori passati dal costruttore o settati successivamente
	 * tramite i SET dei vari parametri
	 *
	 * @return string Intero script per la gestione della Dialog Box
	 */
	
	public function autogenerateScriptConfig()
	{
		$script  = "<script type='text/javascript'>";
		$script .= "$(function(){ ";
		$script .= "$('#" . $this->divName . "').dialog({ ";
		$script .= "bgiframe: true, ";
		$script .= "autoOpen: " . parent::printBooleanString($this->autoOpen) . ", ";
		$script .= "resizable: " . parent::printBooleanString($this->resizable) . ", ";
		$script .= "height: " . $this->height . ", ";
		$script .= "width: " . $this->width . ", ";
		$script .= "modal: true";

		if(count($this->action) > 0)
		{
			$script .= ", buttons: {";

			foreach ($this->action as $azione)
			{
				$function = "dialogAction" . $azione['NAME'];

				$script .= $this->$function($azione['LABEL'], $azione['CALLBACK']);

				if(!(end($this->action) == $azione))
				{
					$script .= ", ";
				}
			}

			$script .= "}";
		}
		
		if(is_string($this->url))
		{
			$script .= ", open: function(){ ";
			$script .= "$(this).html(\"<div class='loading'>Attendere il caricamento dei dati...</div>\").load('" . $this->url . "'); ";
			$script .= "}";
		}
		
		$script .= "}); ";
		$script .= "});";

		if(count($this->showOption) > 0)
		{
			foreach ($this->showOption as $class => $tagName)
			{
				$script .= "$('." . $class . "').live('click', function(){ ";
				$script .= "$('#" . $this->divName . "').html(\"<div class='loading'>Attendere il caricamento dei dati...</div>\").load($(this).attr('" . $tagName . "')).dialog('open'); ";
				$script .= "});";
			}
		}

		$script .= "</script>";

		if($this->createdButton and !$this->createdButtonScript)
		{
			$script .= $this->autogenerateScriptButtonConfig();
		}

		return $script;
	}

	public function autogenerateScriptButtonConfig()
	{
		$script = "<script type='text/javascript'>";
		
		if(!is_null($this->url))
		{
			$script .= "$('#buttuonOpen_" . $this->divName . "').click(function(){ ";
			$script .= "$('#" . $this->divName . "').dialog('open'); ";
			$script .= "});";
		}

		$script .= "</script>";

		return $script;
	}

	/*** -------------------- *** AZIONI PREIMPOSTATE *** -------------------- ***/
	
	/**
	 * Azione che ricarica i dati passati tramite URL
	 *
	 * @param string $label		Etichetta per il pulsante
	 * @return string $action	Script che si aggiunge nella configurazione base della Dialog
	 */

	public function dialogActionRefreshData($label = null)
	{
		if(!is_null($label))
			$label = TD_(self::LABEL_REFRESHDATA, "label");
		
		$action  = "'" . $label . "': function() {";
		$action .= "$(this).html(\"<div class='loading'>Attendere il caricamento dei dati...</div>\").load('" . $this->url . "');";
		$action .= "}";

		return $action;
	}
}
?>
